/**
 * API 使用示例
 * 
 * 此文件展示了如何使用封装后的API接口
 * 在实际开发中，可以参考这些示例来进行API调用
 */

import { api, apiCommon, ApiService, request } from '@/api'
import type { Camera, User, LoginForm } from '@/types'

/**
 * 示例1: 基础API调用
 */
export class ApiUsageExample {
  

  /**
   * 获取摄像头列表示例
   */
  static async getCameraListExample() {
    try {
      // 方式1: 使用封装的服务类
      const response = await api.camera.getList({
        page: 1,
        pageSize: 20,
        status: 'online'
      })
      
      // 方式2: 使用安全调用，提供默认值
      const safeData = await ApiService.safeCall(
        () => api.camera.getList({ page: 1, pageSize: 20 }),
        { list: [], total: 0, page: 1, pageSize: 20, totalPages: 0 }
      )
      
      return response.data
    } catch (error) {
      console.error('获取摄像头列表失败:', error)
      return { list: [], total: 0, page: 1, pageSize: 20, totalPages: 0 }
    }
  }

  /**
   * 摄像头管理示例
   */
  static async cameraManagementExample() {
    try {
      // 创建摄像头
      const newCamera: Partial<Camera> = {
        name: '测试摄像头',
        code: 'TEST001',
        ip: '192.168.1.100',
        port: 8080,
        username: 'admin',
        password: 'admin123',
        longitude: 118.123456,
        latitude: 39.123456,
        location: '测试位置'
      }
      
      const createResponse = await api.camera.create(newCamera)
      const cameraId = createResponse.data.id
      
      // 获取详情
      const detail = await api.camera.getDetail(cameraId)
      
      // 更新摄像头
      await api.camera.update(cameraId, {
        name: '更新后的摄像头名称'
      })
      
      // 获取状态
      const status = await api.camera.getCameraStatus(cameraId)
      
      console.log('摄像头状态:', status.data)
      
      return createResponse.data
    } catch (error) {
      console.error('摄像头管理操作失败:', error)
      throw error
    }
  }

  /**
   * 并发API调用示例
   */
  static async parallelCallExample() {
    try {
      // 并发获取多个数据
      const results = await ApiService.parallel({
        userInfo: () => api.auth.getUserInfo(),
        cameraList: () => api.camera.getList({ page: 1, pageSize: 10 }),
        menuList: () => api.menu.getList({})
      })
      
      console.log('用户信息:', results.userInfo.data)
      console.log('摄像头列表:', results.cameraList.data)
      console.log('菜单列表:', results.menuList.data)
      
      return results
    } catch (error) {
      console.error('并发调用失败:', error)
      throw error
    }
  }

  /**
   * 页面数据获取示例
   */
  static async dashboardDataExample() {
    try {
      // 使用预定义的组合API调用
      const dashboardData = await apiCommon.getDashboardData()
      
      console.log('仪表板数据:', dashboardData)
      
      return dashboardData
    } catch (error) {
      console.error('获取仪表板数据失败:', error)
      throw error
    }
  }

  /**
   * 文件上传示例
   */
  static async uploadExample(file: File) {
    try {
      const formData = new FormData()
      formData.append('file', file)
      formData.append('type', 'avatar')
      
      const response = await request.upload('/upload', formData)
      
      console.log('上传成功:', response.data)
      return response.data
    } catch (error) {
      console.error('上传失败:', error)
      throw error
    }
  }

  /**
   * 文件下载示例
   */
  static async downloadExample(fileId: string) {
    try {
      const blob = await request.download('/download', { fileId })
      
      // 创建下载链接
      const url = window.URL.createObjectURL(blob)
      const link = document.createElement('a')
      link.href = url
      link.download = `file_${fileId}.pdf`
      link.click()
      
      // 清理URL对象
      window.URL.revokeObjectURL(url)
    } catch (error) {
      console.error('下载失败:', error)
      throw error
    }
  }

  /**
   * 错误处理示例
   */
  static async errorHandlingExample() {
    try {
      // 尝试获取不存在的资源
      const response = await api.camera.getDetail(99999)
      return response.data
    } catch (error) {
      // 根据错误类型进行不同的处理
      if (error.response?.status === 404) {
        console.log('资源不存在')
        return null
      } else if (error.response?.status === 401) {
        console.log('未授权，需要重新登录')
        // 跳转到登录页面
        window.location.href = '/login'
      } else {
        console.error('其他错误:', error.message)
      }
      
      throw error
    }
  }
}

/**
 * 在 Vue 组件中使用示例
 */
export const VueComponentExample = `
<template>
  <div>
    <el-button @click="loadData">加载数据</el-button>
    <el-table :data="cameraList" v-loading="loading">
      <!-- 表格列定义 -->
    </el-table>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { api, ApiService } from '@/api'
import type { Camera } from '@/types'

const loading = ref(false)
const cameraList = ref<Camera[]>([])

// 加载数据
const loadData = async () => {
  loading.value = true
  try {
    // 安全调用API，提供默认值
    const data = await ApiService.safeCall(
      () => api.camera.getList({ page: 1, pageSize: 20 }),
      { list: [], total: 0, page: 1, pageSize: 20, totalPages: 0 }
    )
    
    cameraList.value = data.list
  } catch (error) {
    console.error('加载数据失败:', error)
  } finally {
    loading.value = false
  }
}

// 组件挂载时加载数据
onMounted(() => {
  loadData()
})
</script>
`

export default ApiUsageExample